home *** CD-ROM | disk | FTP | other *** search
- ;;
- ;; aPLib compression library - the smaller the better :)
- ;;
- ;; TASM / MASM / WASM assembler depacker
- ;;
- ;; Copyright (c) 1998-2000 by Joergen Ibsen / Jibz
- ;; All Rights Reserved
- ;;
-
- .386p
- .MODEL flat
-
- .CODE
-
- PUBLIC _aP_depack_asm
-
- _aP_depack_asm:
- pushad
-
- mov esi, [esp + 36] ; C calling convention
- mov edi, [esp + 40]
-
- cld
- mov dl, 80h
-
- literal:
- movsb
- nexttag:
- call getbit
- jnc literal
-
- xor ecx, ecx
- call getbit
- jnc codepair
- xor eax, eax
- call getbit
- jnc shortmatch
- inc ecx
- mov al, 10h
- getmorebits:
- call getbit
- adc al, al
- jnc getmorebits
- jnz domatch
- stosb
- jmp short nexttag
- codepair:
- call getgamma_no_ecx
- dec ecx
- loop normalcodepair
- call getgamma
- jmp short domatch_lastpos
-
- shortmatch:
- lodsb
- shr eax, 1
- jz donedepacking
- adc ecx, ecx
- jmp short domatch_with_2inc
-
- normalcodepair:
- xchg eax, ecx
- dec eax
- shl eax, 8
- lodsb
- call getgamma
- cmp eax, 32000
- jae domatch_with_2inc
- cmp ah, 5
- jae domatch_with_inc
- cmp eax, 7fh
- ja domatch_new_lastpos
-
- domatch_with_2inc:
- inc ecx
-
- domatch_with_inc:
- inc ecx
-
- domatch_new_lastpos:
- xchg eax, ebp
- domatch_lastpos:
- mov eax, ebp
-
- domatch:
- push esi
- mov esi, edi
- sub esi, eax
- rep movsb
- pop esi
- jmp short nexttag
-
- getbit:
- add dl, dl
- jnz stillbitsleft
- mov dl, [esi]
- inc esi
- adc dl, dl
- stillbitsleft:
- ret
-
- getgamma:
- xor ecx, ecx
- getgamma_no_ecx:
- inc ecx
- getgammaloop:
- call getbit
- adc ecx, ecx
- call getbit
- jc getgammaloop
- ret
-
- donedepacking:
- sub edi, [esp + 40]
- mov [esp + 28], edi ; return unpacked length in eax
-
- popad
- ret
-
- END
-